import { ref } from 'vue'
import type { WindowControlArea } from '../class/windowcontrolarea'
import {
  windowSeparatorLineWidth,
  type WindowSeparatorLine,
} from '../class/windowseparatorline'
import {
  minWindowHeight,
  minWindowWidth,
  type BaseWindow,
  type Layout,
} from '../class/basewindow'

export const windows = ref<Array<BaseWindow>>([])
export const windowLines = ref<Array<WindowSeparatorLine>>([])
export const windowControlAreas = ref<Array<WindowControlArea>>([])

const halfLineWidth = windowSeparatorLineWidth / 2

// 获取所有与指定线段相互影响的线段，并按从左到右（竖直线）或从上到下（水平线）的顺序排序
// line需要有flow、top、bottom、left、right
function getRelativeLines(line: WindowSeparatorLine) {
  const lines = windowLines.value.filter(item => {
    if (item.flow === line.flow) {
      // 如果走向相同
      if (line.flow === 'Horizontal') {
        // 如果是水平的
        if (item.left > line.left && item.left < line.right) {
          // 如果遍历的线段左端点在指定线段的区间内
          return true
        } else if (item.right > line.left && item.right < line.right) {
          // 如果遍历的线段右端点在指定线段的区间内
          return true
        } else if (item.left <= line.left && item.right >= line.right) {
          // 如果遍历的线段区间包含指定线段的区间
          return true
        } else {
          return false
        }
      } else {
        // 如果是垂直的
        if (item.top > line.top && item.top < line.bottom) {
          // 如果遍历的线段上端点在指定线段的区间内
          return true
        } else if (item.bottom > line.top && item.bottom < line.bottom) {
          // 如果遍历的线段下端点在指定线段的区间内
          return true
        } else if (item.top <= line.top && item.bottom >= line.bottom) {
          // 如果遍历的线段区间包含指定线段的区间
          return true
        } else {
          return false
        }
      }
    } else {
      // 如果走向不同
      return false
    }
  })
  lines.sort((a: WindowSeparatorLine, b: WindowSeparatorLine) => {
    if (a.flow === 'Horizontal') {
      // 如果是水平线
      return a.top - b.top
    } else {
      // 如果是竖直线
      return a.left - b.left
    }
  })
  return lines
}

// 获取指定的分割线
// line需要有layout、index
function getLine(layout: Layout, index: number) {
  return windowLines.value.find(
    item => item.layout === layout && item.index === index
  )
}

// 获取指定分割线在集合中的序数
// line需要有layout与index属性
function getLineIndex(
  lines: Array<WindowSeparatorLine>,
  line: WindowSeparatorLine
) {
  return lines.findIndex(
    item => item.layout === line.layout && item.index === line.index
  )
}

// 获取可移动区间
// line需要有layout、index、flow、top、bottom、left、right
export function getMoveArea(line: WindowSeparatorLine) {
  const lines = getRelativeLines(line)
  const index = getLineIndex(lines, line)
  const limit: Array<number> = []
  if (index === 0) {
    // 如果是第一条线
    if (line.flow === 'Horizontal') {
      // 如果是水平线
      limit[0] = minWindowHeight + halfLineWidth
    } else {
      // 如果是垂直线
      limit[0] = minWindowWidth + halfLineWidth
    }
  } else {
    // 如果不是第一条线
    if (line.flow === 'Horizontal') {
      // 如果是水平线
      limit[0] = lines[index - 1].bottom + minWindowHeight + halfLineWidth
    } else {
      // 如果是垂直线
      limit[0] = lines[index - 1].right + minWindowWidth + halfLineWidth
    }
  }
  if (index === lines.length - 1) {
    // 如果是最后一条线
    if (line.flow === 'Horizontal') {
      // 如果是水平线
      const height = line.layout.rect?.height as number
      limit[1] = height - minWindowHeight - halfLineWidth
    } else {
      // 如果是垂直线
      const width = line.layout.rect?.width as number
      limit[1] = width - minWindowWidth - halfLineWidth
    }
  } else {
    // 如果不是最后一条线
    if (line.flow === 'Horizontal') {
      // 如果是水平线
      limit[1] = lines[index + 1].top - minWindowHeight - halfLineWidth
    } else {
      // 如果是垂直线
      limit[1] = lines[index + 1].left - minWindowWidth - halfLineWidth
    }
  }
  return limit
}

// 获取指定位置所在的窗口
// x、y为相对容器的位置
export function getWindowByPoint(x: number, y: number) {
  return windows.value.find(item => {
    const top = item.top as number
    const bottom = item.bottom as number
    const left = item.left as number
    const right = item.right as number
    if (x >= left && x <= right && y >= top && y <= bottom) {
      return true
    } else {
      return false
    }
  })
}
